﻿Public Class frmPagarFactura 
    Public cancela As Boolean
    Public pc As String = My.Computer.Name.ToString
    Public PagoPorDefecto As Integer = ConexionSGS.EjecutarQueryScalar("select idtipopago from tipospago where isdefault = 'true'")
    
    Public Sub LlamarReporte()
        Try
            'llamar el reporte
            Dim anchoBanda As Integer = 19
            Dim items As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT COUNT(iditem) AS numitems FROM vfacturadetalle WHERE idfactura = {0}", tidfact.EditValue))
            Dim pagos As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT COUNT(idtipopago) AS numpagos FROM vfacturaspago WHERE idfactura = {0}", tidfact.EditValue))
            If My.Forms.frmFactura.subsidiootorgado.EditValue > 0 Then
                Dim report As New reportFactura

                report.VreportefacturaimpresaTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vreportefacturaimpresa, tidfact.EditValue)
                report.VfacturaspagoTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vfacturaspago, tidfact.EditValue)
                report.VfacturadetalleTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vfacturadetalle, tidfact.EditValue)
                report.SysconfigTableAdapter1.FillById(report.DbFireAndIceDataSet1.sysconfig, 1)

                report.PageHeight = report.PageHeight + anchoBanda * (items - 1)
                report.PageHeight = report.PageHeight + anchoBanda * (pagos - 1)
                'report.Margins.Bottom = 139

                AddHandler report.PrintingSystem.StartPrint, AddressOf ReportOnStartPrint
                report.Print()
                'report.ShowPreview()


                'imprimir doble si es cliente de Stream
                If (ConexionSGS.EjecutarQueryScalar(String.Format("select idempresa from clientes where idcliente = '{0}'", My.Forms.frmFactura.IdclienteTextEdit.EditValue)) = 1) Then
                    report.Print()
                End If
            Else 'Si no tiene pago por subsidio (No Afialiado o Credito)
                Dim report As New reportFactura2

                report.VreportefacturaimpresaTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vreportefacturaimpresa, tidfact.EditValue)
                report.VfacturaspagoTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vfacturaspago, tidfact.EditValue)
                report.VfacturadetalleTableAdapter.FillByIdFact(report.DbFireAndIceDataSet1.vfacturadetalle, tidfact.EditValue)
                report.SysconfigTableAdapter1.FillById(report.DbFireAndIceDataSet1.sysconfig, 1)

                report.PageHeight = report.PageHeight + anchoBanda * (items - 1)
                report.PageHeight = report.PageHeight + anchoBanda * (pagos - 1)
                AddHandler report.PrintingSystem.StartPrint, AddressOf ReportOnStartPrint
                report.Print()
                'report.ShowPreview()

                'imprimir doble si es factura de crédito
                If ConexionSGS.EjecutarQueryScalar(String.Format("SELECT montopago FROM facturaspago WHERE idtipopago = 3 AND idfactura = {0}", tidfact.EditValue)) > 0 Then
                    report.Print()
                End If
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al llamar el reporte de factura desde la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LlamarReporte()")
        End Try

    End Sub

    ''' <summary>
    ''' Define el pago por defecto con las consideraciones necesarias, para los clientes normales es Efectivo(1) y algunas empresas como Cargill manejan pagos por Planilla(5) 13/Jul/13
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub DefinirPagoPorDefecto()
        Try
            Dim idEmpresa As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("Select idempresa from clientes where idcliente = '{0}'", My.Forms.frmFactura.IdclienteTextEdit.EditValue))
            'Obtiene el pago por defecto
            idpagotextedit.EditValue = CDec(PagoPorDefecto)

            'Obtiene la empresa cargada en la factura y sí es Cargill(10) el tipo pago default es Planilla(5)
            If idEmpresa = 10 Then
                idpagotextedit.EditValue = CDec(5)
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al definir el pago por defecto.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "DefinirPagoPorDefecto()")
        End Try
    End Sub

    Private Sub frmPagarFactura_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            'Inicializa variable que verifica si cancela la factura o sólo cierra pantalla de pago
            cancela = True
            TipospagoTableAdapter.Fill(DbFireAndIceDataSet.tipospago)
            'cargando valores por defecto
            Try
                'regresa el ultimo idfactura de esa caja
                tidfact.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", pc))
            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "Ha ocurrido un error al calcular el idfactura.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
            End Try

            'Llena los pagos de la factura filtrados
            FacturaspagoTableAdapter.FillByIdFact(DbFireAndIceDataSet.facturaspago, tidfact.EditValue)

            ' Calcula el total ingresado en el detalle temporal de la factura
            tTotal.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("(SELECT SUM(totallinea) AS total FROM facturasdetalletemp WHERE (idfactura = {0}) GROUP BY idfactura);", tidfact.EditValue))

            tSaldoPendiente.EditValue = tTotal.EditValue - tpagado.EditValue
            tpagado.EditValue = 0
            tEfectivo.EditValue = 0
            tCambiod.EditValue = 0

            DefinirPagoPorDefecto()



            tmonto.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("(SELECT SUM(totallinea) AS total FROM facturasdetalletemp WHERE (idfactura = {0}) GROUP BY idfactura);", tidfact.EditValue))
            tclienteid.EditValue = My.Forms.frmFactura.IdclienteTextEdit.EditValue
            Dim subsidio As Integer = My.Forms.frmFactura.subsidiodisp.EditValue
            'Asigna un valor al subsidio del cliente
            If subsidio > 0 Then
                tsubsidio.EditValue = My.Forms.frmFactura.subsidiodisp.EditValue
                idpagotextedit.EditValue = CDec(2)
                'Valida si el subsidio es mayor que el total el monto a pagar es el total, de lo contrario es el subsidio
                If subsidio > tTotal.EditValue Then
                    tmonto.EditValue = tTotal.EditValue
                Else
                    tmonto.EditValue = subsidio
                End If
            Else
                tsubsidio.EditValue = 0
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error mientras se cargaba la pantalla.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al cargar la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tpagado_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpagado.EditValueChanged
        tSaldoPendiente.EditValue = tTotal.EditValue - tpagado.EditValue
    End Sub

    Private Sub SimpleButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btGuardar.Click
        cancela = False
        Dim totalpagado As Double = 0
        Try
            'calcula el total pago ingresado
            totalpagado = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT sum(montopago) AS total FROM facturaspago GROUP BY idfactura HAVING idfactura = {0}", tidfact.EditValue))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al calcular el idfactura.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try

        Try
            If totalpagado <= 0 Then
                MsgBox("No ha efectuado ningún pago.", MsgBoxStyle.Exclamation, "Notificación")
                ErrorProvider1.SetError(idpagotextedit, "No ha efectuado ningún pago.")
            ElseIf totalpagado < tTotal.EditValue Then
                MsgBox("No ha pagado el total facturado.", MsgBoxStyle.Exclamation, "Notificación")
                ErrorProvider1.SetError(idpagotextedit, "No ha pagado el total facturado.")
            Else
                ErrorProvider1.SetError(idpagotextedit, Nothing)
                Dim tot_efectivo As Double
                'Devuelve el monto pagado con efectivo en la factura para calcular el cambio a otorgar
                If ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(montopago) AS monto FROM  facturaspago GROUP BY idfactura, idtipopago HAVING idfactura = {0} AND idtipopago = 1", tidfact.Text)) Then
                    tot_efectivo = FacturaspagoTableAdapter.ScalarQueryObtienePagoEnEfectivo(Val(tidfact.Text), 1)
                Else
                    tot_efectivo = 0
                End If

                If tEfectivo.EditValue = 0 Then
                    tEfectivo.EditValue = tot_efectivo
                End If

                Try
                    'insertar detalle
                    ConexionSGS.EjecutarQueryNonQuery(String.Format("SELECT copia_detalle({0})", tidfact.EditValue))
                Catch ex As Exception
                    LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al insertar el detalletemp a detalle de factura copia_detalle(), frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
                End Try

                'inserta encabezado completo
                'Dim noticket As Integer = 1
                'noticket = ConexionSGS.EjecutarQueryScalar("SELECT MAX(numfactura) + 1 AS numticket FROM facturas ORDER BY numticket DESC")

                Try
                    ConexionSGS.EjecutarQueryNonQuery(String.Format("UPDATE  facturas SET fecha = CURRENT_DATE, subtotal = {0}, total = {1}, descuento = {2}, observacion = '{3}', idcliente = '{4}', iduser = {5}, nombrepc = '{6}', cambiootorgado = {7}, efectivorecibido = {8}, hora = CURRENT_TIME, nula = '{9}' WHERE (idfactura = {10})", 0, tTotal.EditValue, 0, My.Forms.frmFactura.ObservacionTextBox.Text, My.Forms.frmFactura.IdclienteTextEdit.EditValue, My.Forms.frmFactura.IdUsuario.EditValue, My.Forms.frmFactura.tNombrePC.Text, tCambiod.EditValue, tEfectivo.EditValue, False, tidfact.EditValue))
                Catch ex As Exception
                    LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al actualizar datos completos de la factura UpdateQueryAlGuardarFactura, frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
                End Try

                LlamarReporte()

                'OpenCashDrawer()
                ConexionSGS.EjecutarQueryNonQuery(String.Format("DELETE FROM facturasdetalletemp WHERE idfactura = (SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}'));", pc))

                My.Forms.frmFactura.LimpiarPantalla()
                AlertControl1.AppearanceCaption.ForeColor = Color.Green
                AlertControl1.Show(Me, "Notificación", My.Resources.StringGlobal.msjGuardarExito)
                Close()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al generar la factura.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para generar la factura desde la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub ReportOnStartPrint(ByVal sender As Object, ByVal e As DevExpress.XtraPrinting.PrintDocumentEventArgs)
        'If ClientesTableAdapter1.ScalarQueryDevuelveIdEmpresa(My.Forms.frmFactura.IdclienteTextEdit.EditValue) = 1 Then
        '    e.PrintDocument.PrinterSettings.Copies = 2
        'End If
    End Sub

    'Private Sub OpenCashDrawer()
    '    Dim intFileNo As Integer = FreeFile()

    '    'Use this code if you are using LPT Port
    '    FileOpen(1, "c:\escapes.txt", OpenMode.Output)
    '    PrintLine(1, Chr(27) & "p" & Chr(0) & Chr(25) & Chr(250))
    '    FileClose(1)

    '    Shell("print /d:lpt1 c:\escapes.txt", vbNormalFocus)

    '    'Use this code if you are using COM Port
    '    FileOpen(1, AppDomain.CurrentDomain.BaseDirectory & "open.txt", OpenMode.Output)
    '    PrintLine(1, Chr(27) & Chr(112) & Chr(0) & Chr(25) & Chr(250))
    '    FileClose(1)

    '    Shell("print /d:com1 open.txt", AppWinStyle.Hide)
    'End Sub

    Private Sub btRegresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRegresar.Click
        'limpiar detalle facturaspago
        Try
            ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_detalle_pago({0});", Str(tidfact.EditValue)))
            ErrorProvider1.SetError(idpagotextedit, Nothing)
            ErrorProvider1.SetError(tEfectivo, Nothing)
            ErrorProvider1.SetError(tmonto, Nothing)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al eliminar los pagos.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la sentencia select elimina_detalle_pago() en la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
        Close()
    End Sub

    Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCancelar.Click
        Dim opcion As Integer
        opcion = MsgBox("¿Seguro que desea cancelar la factura?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Confirmación")
        If opcion = vbYes Then

            'eliminar la factura completa
            Try
                Dim idfactura As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", My.Computer.Name))
                ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_factura_completa({0})", idfactura))

                ErrorProvider1.SetError(idpagotextedit, Nothing)
                ErrorProvider1.SetError(tEfectivo, Nothing)
                ErrorProvider1.SetError(tmonto, Nothing)

                My.Forms.frmFactura.LimpiarPantalla()
                Close()

            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "Ha ocurrido un error al cancelar la factura.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para cancelar la factura en la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            End Try


        End If
    End Sub

    Private Sub tEfectivo_EditValueChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tEfectivo.EditValueChanged
        Try
            If tEfectivo.EditValue < FacturaspagoTableAdapter.ScalarQueryObtienePagoEnEfectivo(tidfact.EditValue, 1) Then
                ErrorProvider1.SetError(tEfectivo, "El monto recibido en efectivo es menor al total de factura.")
                Return
            Else
                ErrorProvider1.SetError(tEfectivo, Nothing)
                tCambiod.EditValue = tEfectivo.EditValue - Me.FacturaspagoTableAdapter.ScalarQueryObtienePagoEnEfectivo(tidfact.EditValue, 1)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

    Private Sub SimpleButton1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt5.Click
        tEfectivo.EditValue += 5
    End Sub

    Private Sub bt10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt10.Click
        tEfectivo.EditValue += 10
    End Sub

    Private Sub bt20_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt20.Click
        tEfectivo.EditValue += 20
    End Sub

    Private Sub bt50_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt50.Click
        tEfectivo.EditValue += 50
    End Sub

    Private Sub bt100_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt100.Click
        tEfectivo.EditValue += 100
    End Sub

    Private Sub bt500_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt500.Click
        tEfectivo.EditValue += 500
    End Sub


    Private Sub bt2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt2.Click
        tEfectivo.EditValue += 2
    End Sub

    Private Sub bt1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt1.Click
        tEfectivo.EditValue += 1
    End Sub

    Private Sub btRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRemove.Click
        Try
            Dim monto As Double = GridView1.GetRowCellValue(GridView1.FocusedRowHandle, "montopago")
            Dim idpago As Integer = GridView1.GetRowCellValue(GridView1.FocusedRowHandle, "idtipopago")
            If idpago = 2 Then
                tsubsidio.EditValue += monto
            End If

            FacturaspagoTableAdapter.DeleteQuery(GridView1.GetRowCellValue(GridView1.FocusedRowHandle, "idfacturaspago"))
            If GridView1.GetRowCellValue(GridView1.FocusedRowHandle, "idtipopago") = 1 Then
                If tEfectivo.EditValue - monto > 0 Then
                    tEfectivo.EditValue -= monto
                Else
                    tEfectivo.EditValue = 0
                End If

            End If

            FacturaspagoTableAdapter.FillByIdFact(DbFireAndIceDataSet.facturaspago, tidfact.EditValue)
            tpagado.EditValue = FacturaspagoTableAdapter.ScalarQueryMontoPagoPorFactura(tidfact.EditValue)
            tmonto.EditValue = tSaldoPendiente.EditValue
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al eliminar el pago.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al eliminar un pago en la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try

    End Sub

    Private Sub idpagotextedit_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles idpagotextedit.EditValueChanged
        tmonto.EditValue = tSaldoPendiente.EditValue
    End Sub

    Private Sub tmonto_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles tmonto.KeyPress
        If e.KeyChar = ChrW(Keys.Enter) Then
            btAgregarPago.PerformClick()
        End If
    End Sub

    Public Function GetConnnectionString()
        Const fic As String = "configuracion.txt"
        Dim diract As String = ""
        diract = System.IO.Directory.GetCurrentDirectory()

        Dim direccion As String = ""

        direccion = String.Format("{0}\{1}", diract, fic)

        Dim connstring As String = ""
        Try
            Dim sr As New System.IO.StreamReader(direccion)
            connstring = sr.ReadToEnd()
            sr.Close()
            Console.WriteLine(connstring)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Error al obtener la conexion con la base de datos.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la función GetConnnectionString de la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "GetConnnectionString")
        End Try
        Return connstring
    End Function

    Private Sub frmPagarFactura_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If cancela = True Then
            'limpiar detalle facturaspago
            Try
                ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_detalle_pago({0});", Str(tidfact.EditValue)))
            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "Ha ocurrido un error al eliminar los pagos.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la sentencia select elimina_detalle_pago() en la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            End Try
        End If
    End Sub

    Private Sub btAgregarPago_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAgregarPago.Click
        Try
            'Validar/Corregir error si no cargó el total de la factura en el Load
            If tTotal.Text = "" Then
                tTotal.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(totallinea) AS total FROM facturasdetalletemp WHERE (idfactura = {0}) GROUP BY idfactura", tidfact.EditValue))
                tSaldoPendiente.EditValue = tTotal.EditValue - tpagado.EditValue
                tmonto.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(totallinea) AS total FROM facturasdetalletemp WHERE (idfactura = {0}) GROUP BY idfactura", tidfact.EditValue))
                Dim ex As System.Exception = Nothing
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Es necesario dejar la validación en el boton de agregar pago que valida si se cargaron los datos del total de la fcatura en la pantalla frmFactura", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            Else
                Dim tipopago As Integer = idpagotextedit.EditValue
                Dim pagoexiste As Integer = 0
                pagoexiste = tienepago(tipopago)

                If validapago(tipopago) Then
                    Select Case tipopago
                        Case 1 'EFECTIVO
                            PagoXEfectivo()

                        Case 2 'SUBSIDIO
                            PagoXSubsidio()

                        Case 3 'CREDITO
                            PagoXCredito()

                        Case 4 'TARJETA DE CREDITO
                            PagoXtTarjeta()

                        Case 5 'PLANILLA
                            PagoXPlanilla()
                    End Select
                    FacturaspagoTableAdapter.FillByIdFact(DbFireAndIceDataSet.facturaspago, tidfact.EditValue)
                    tpagado.EditValue = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(montopago) AS monto FROM facturaspago GROUP BY idfactura HAVING idfactura = {0}", tidfact.EditValue))
                    tmonto.EditValue = tSaldoPendiente.EditValue
                    DefinirPagoPorDefecto()
                End If
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al agregar el pago.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para agregar pago en la pantalla frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try

    End Sub

    Private Sub PagoXEfectivo()
        Try
            Dim tipopago As Integer = idpagotextedit.EditValue
            Dim pagoexiste As Integer = 0
            pagoexiste = tienepago(tipopago)
            If pagoexiste = 0 Then
                InsertaPago(1, tmonto.EditValue)
            Else
                MsgBox("El tipo de pago ya fue ingresado, se sumará al monto anterior.", MsgBoxStyle.Information, "Notificación")
                ActualizaPago(tipopago, tmonto.EditValue)
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de ingresar el pago EFECTIVO", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "PagoXEfectivo()")
        End Try
    End Sub

    Private Sub PagoXSubsidio()
        Try
            Dim tipopago As Integer = idpagotextedit.EditValue
            Dim pagoexiste As Integer = 0
            pagoexiste = tienepago(tipopago)
            If tsubsidio.EditValue > 0 Then
                If Val(tmonto.EditValue) > tsubsidio.EditValue Then
                    tmonto.EditValue = 0
                    ErrorProvider1.SetError(tmonto, "Monto superior a subsidio disponible.")
                Else
                    ErrorProvider1.SetError(tmonto, Nothing)
                    'insertando el pago por subsidio
                    If (tmonto.EditValue <= tsubsidio.EditValue) Then
                        If pagoexiste > 0 Then
                            MsgBox("El tipo de pago ya fue ingresado, se sumará al monto anterior.", MsgBoxStyle.Exclamation, "Notificación")
                            ActualizaPago(tipopago, tmonto.EditValue)
                            tsubsidio.EditValue -= tmonto.EditValue
                        Else
                            'Inserta el pago de subsidio (2)
                            InsertaPago(tipopago, tmonto.EditValue)
                            tsubsidio.EditValue -= tmonto.EditValue
                        End If
                        ErrorProvider1.SetError(idpagotextedit, Nothing)
                    Else
                        MsgBox("El subsidio del cliente es insuficiente", MsgBoxStyle.Exclamation, "Notificación")
                        tmonto.EditValue = 0
                    End If
                End If
            Else
                ErrorProvider1.SetError(idpagotextedit, "El cliente no dispone de subsidio.")
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de ingresar el pago SUBSIDIO", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "PagoXSubsidio()")
        End Try
    End Sub

    Private Sub PagoXCredito()
        Try
            Dim tipopago As Integer = idpagotextedit.EditValue
            Dim pagoexiste As Integer = 0
            pagoexiste = tienepago(tipopago)
            If (ConexionSGS.EjecutarQueryScalar(String.Format("SELECT permitecredito FROM Clientes WHERE idcliente = '{0}'", tclienteid.EditValue))) Then
                If pagoexiste = 0 Then
                    InsertaPago(tipopago, tmonto.EditValue)
                Else
                    MsgBox("El tipo de pago ya fue ingresado, se sumará al monto anterior.", MsgBoxStyle.Information, "Notificación")
                    ActualizaPago(tipopago, tmonto.EditValue)
                End If
            Else
                MsgBox("Este cliente no tiene créditos")
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de ingresar el pago CREDITO", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "PagoXCredito()")
        End Try
    End Sub

    Private Sub PagoXtTarjeta()
        Try
            Dim tipopago As Integer = idpagotextedit.EditValue
            Dim pagoexiste As Integer = 0
            pagoexiste = tienepago(tipopago)
            If pagoexiste = 0 Then
                InsertaPago(tipopago, tmonto.EditValue)
            Else
                MsgBox("El tipo de pago ya fue ingresado, se sumará al monto anterior.", MsgBoxStyle.Information, "Notificación")
                ActualizaPago(tipopago, tmonto.EditValue)
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de ingresar el pago TARJETA", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "PagoXTarjeta()")
        End Try
    End Sub

    Private Sub PagoXPlanilla()
        Try
            Dim tipopago As Integer = idpagotextedit.EditValue
            Dim pagoexiste As Integer = 0
            pagoexiste = tienepago(tipopago)
            If (ConexionSGS.EjecutarQueryScalar(String.Format("SELECT permiteplanilla FROM Clientes WHERE idcliente = '{0}'", tclienteid.EditValue))) Then
                If pagoexiste = 0 Then
                    InsertaPago(tipopago, tmonto.EditValue)
                Else
                    MsgBox("El tipo de pago ya fue ingresado, se sumará al monto anterior.", MsgBoxStyle.Information, "Notificación")
                    ActualizaPago(tipopago, tmonto.EditValue)
                End If
            Else
                MsgBox("Este cliente no tiene opción a pagos por planilla", MsgBoxStyle.Exclamation, "Notificación")
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de ingresar el pago PLANILLA", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "PagoXPlanilla()")
        End Try
    End Sub

    Private Function validapago(ByVal idpago As Integer)
        Dim exito As Boolean = False
        Try
            If tmonto.Text = "" Then
                ErrorProvider1.SetError(tmonto, "Debe ingresar un monto.")
            ElseIf idpagotextedit.Text = "" Then
                ErrorProvider1.SetError(idpagotextedit, "Debe ingresar un tipo de pago.")
            ElseIf tmonto.EditValue = 0 Then
                ErrorProvider1.SetError(tmonto, "El pago debe ser mayor a 0.")
            ElseIf ((FacturaspagoTableAdapter.ScalarQueryMontoPagoPorFactura(Val(tidfact.Text)) + tmonto.EditValue) > tTotal.EditValue) Then
                MsgBox("El monto es mayor al total de la factura.", MsgBoxStyle.Exclamation, "Notificación")
            ElseIf ValidacionesEspecialesFacturacionSGSS.ValidarHorarioEspecialFacturacion(My.Forms.frmFactura.IdempresaTextEdit.EditValue, idpago) Then 'Validando si está facturando a una empresa con tipo de pago condicionado por horario
                ErrorProvider1.SetError(tmonto, Nothing)
                ErrorProvider1.SetError(idpagotextedit, Nothing)
                ErrorProvider1.SetError(tmonto, Nothing)
                exito = True
            End If
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de validar el pago", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "validapago()")
        End Try
        Return exito
    End Function

    Private Sub InsertaPago(ByVal idpago, ByVal monto)
        'inserta pagos a facturaspago
        Try
            ConexionSGS.EjecutarQueryNonQuery(String.Format("INSERT INTO facturaspago(idfactura, idtipopago, montopago)VALUES ({0},{1},{2});", tidfact.EditValue, idpago, monto))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al ingresar el pago.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se pudo ingresar el pago desde la función InsertaPago(), frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "InsertaPago()")
        End Try
    End Sub

    Private Sub ActualizaPago(ByVal idpago, ByVal monto)
        'inserta pagos a facturaspago
        Try
            ConexionSGS.EjecutarQueryNonQuery(String.Format("UPDATE facturaspago SET montopago =  montopago + {0} WHERE idtipopago = {1} AND idfactura = {2};", monto, idpago, tidfact.EditValue))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al actualizar el pago.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se pudo actualizar el pago desde la función ActualizaPago(), frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "ActualizaPago()")
        End Try
    End Sub

    Private Function tienepago(ByVal idpago)
        Dim num_veces As Integer = 0
        Try
            'Calcula el número de veces que se ha ingresado ese pago
            num_veces = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT COUNT(idtipopago) FROM facturaspago WHERE idtipopago = {0} AND idfactura = {1};", idpago, tidfact.EditValue))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al ingresar el pago.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se pudo ingresar el pago desde la función tienepago(), frmPagarFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "tienepago()")
        End Try
        Return num_veces
    End Function

End Class